MKT-69: Add /blog/[slug] post page with dynamic rendering - #11019
Conversation
- Add gray-matter for frontmatter parsing - Create BlogPost type and zod schema for validation - Implement PT timezone helpers (getNowPt, parsePublishTimePt) - Implement content loading (getAllBlogPosts, getBlogPostBySlug) - Implement isPublished for request-time publish gating - Add validation for frontmatter and duplicate slugs - Create content/blog directory for markdown files Closes: MKT-67
…he Past Adds the first canonical blog post to validate the content pipeline: - Title: PRDs Are Becoming Artifacts of the Past - Slug: prds-are-becoming-artifacts-of-the-past - Status: published - Publish date: 2026-01-12 at 9:00am PT Content sourced from Office Hours S01E15 with Paige Bailey. Closes: MKT-73
- Create blog index page at /blog - Use force-dynamic for request-time publish gating - Require Node.js runtime for filesystem reads - Display posts with title, description, and date - Add empty state when no posts are published - Include tags display (up to 3) Closes: MKT-68
- Create dynamic route for individual blog posts - Use force-dynamic for request-time publish gating - Require Node.js runtime for filesystem reads - Return 404 for drafts, future posts, or invalid slugs - Render Markdown with react-markdown + remark-gfm - No raw HTML rendering (safe by default) - Include consistent typography and styling Closes: MKT-69
Review complete. Previous issue fixed, but 1 new issue introduced.
Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues. |
|
🚀 Preview deployed! Your changes have been deployed to Vercel: Preview URL: https://roo-code-website-fyxsdiwuc-roo-code.vercel.app This preview will be updated automatically when you push new commits to this PR. |
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
| if (dateCompare !== 0) { | ||
| return dateCompare | ||
| } | ||
| return parsePublishTimePt(b.publish_time_pt) - parsePublishTimePt(a.publish_time_pt) |
There was a problem hiding this comment.
parsePublishTimePt is used here but not imported. The import statement on line 7 only includes getNowPt from "./pt-time". This will cause a runtime error when getAllBlogPosts is called. Update line 7 to: import { getNowPt, parsePublishTimePt } from "./pt-time"
Fix it with Roo Code or mention @roomote and request a fix.
Related GitHub Issue
Linear issue: MKT-69
Roo Code Task Context (Optional)
View task on Roo Code Cloud
Description
Adds the
/blog/[slug]page that renders individual blog posts with request-time publish gating.Key implementation details:
export const dynamic = "force-dynamic"ensures publish gating at request timeexport const runtime = "nodejs"for filesystem readsreact-markdown+remark-gfm(no raw HTML)Build output shows dynamic rendering:
Test Procedure
pnpm -C apps/web-roo-code build/blog/prds-are-becoming-artifacts-of-the-pastin devPre-Submission Checklist
Screenshots / Videos
N/A - requires full stack for visual testing
Documentation Updates
Additional Notes
Dependencies (included via merge):
Security:
Get in Touch
Via Roo Code Cloud task link above
Important
Adds a dynamic
/blog/[slug]page with publish gating, markdown rendering, and metadata handling, including content management and validation incontent.ts./blog/[slug]page with dynamic rendering and publish gating usingdynamic = "force-dynamic"andruntime = "nodejs"inpage.tsx.page.tsx.react-markdownandremark-gfmwithout raw HTML inpage.tsx.getAllBlogPosts()andgetBlogPostBySlug()incontent.tsfor loading and filtering posts.zodincontent.ts.BlogContentErrorfor handling content validation errors incontent.ts.page.tsx.ogImageUrlfor generating image URLs for metadata inpage.tsx.gray-matterfor frontmatter parsing inpackage.json.This description was created by
for aa4c2d9. You can customize this summary. It will automatically update as commits are pushed.